package com.qfedu.buy.server.service.impl;

import cn.hutool.crypto.SecureUtil;
import com.qfedu.buy.common.config.SystemConfig;
import com.qfedu.buy.common.dto.PayDto;
import com.qfedu.buy.common.vo.R;
import com.qfedu.buy.server.config.KeyConfig;
import com.qfedu.buy.server.core.alipay.AliPay;
import com.qfedu.buy.server.core.alipay.AliPayUtil;
import com.qfedu.buy.server.core.wxpay.WxPay;
import com.qfedu.buy.server.core.wxpay.WxPayUtil;
import com.qfedu.buy.server.dao.PayDao;
import com.qfedu.buy.server.dao.PayLogDao;
import com.qfedu.buy.server.entity.Pay;
import com.qfedu.buy.server.entity.PayLog;
import com.qfedu.buy.server.service.intf.PayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Base64;

/**
 * @program: NeighborBuy
 * @description:
 * @author: Feri(邢朋辉)
 * @create: 2021-02-01 14:15
 */
@Service
public class PayServiceImpl implements PayService {
    @Autowired
    private PayDao dao;

    @Autowired
    private PayLogDao logDao;
    @Override
    @Transactional //事务
    public R createPay(PayDto dto) {
        String payurl=null;
        if(dto.getType()== SystemConfig.PAY_ALI){
            //支付宝支付
            AliPay pay=new AliPay(dto.getOid(),dto.getMoney()/100.0,dto.getTitle());
            //获取支付链接
            payurl=AliPayUtil.createPay(pay);

        }else if(dto.getType()==SystemConfig.PAY_WX){
            //微信支付
            WxPay wxPay=new WxPay(dto.getTitle(),"",dto.getMoney(),dto.getOid());
            payurl= WxPayUtil.createPay(wxPay);
        }
        //记录数据
        if(payurl!=null){
            if(payurl!=null && payurl.length()>0){
                //记录数据
                Pay p=new Pay(dto.getOid(),dto.getMoney(),dto.getType(),dto.getTitle(),payurl);
                dao.save(p);
                PayLog log=new PayLog(p.getId(),SystemConfig.PAY_STATUS_NO,"新增支付订单");
                logDao.save(log);
                //生成支付二维码 --直接返回图片到浏览器
                return R.ok(KeyConfig.PAYQRCODE_URL+"?msg="+ SecureUtil.aes(Base64.getDecoder().decode(KeyConfig.PAY_KEY)).encryptHex(payurl));
            }
        }
        return R.fail("支付服务故障");
    }

    @Override
    public R queryPay(String oid) {
        Pay pay=dao.select(oid);
        if(pay!=null){
            int t=-1;
            if(pay.getType()==SystemConfig.PAY_ALI){
                //支付宝
                String r=AliPayUtil.queryPay(oid);
                switch (r){
                    case "WAIT_BUYER_PAY":
                     t=SystemConfig.PAY_STATUS_NO;break;
                    case "TRADE_CLOSED":
                        t=SystemConfig.PAY_STATUS_CLOSE;break;
                    case "TRADE_SUCCESS":
                        t=SystemConfig.PAY_STATUS_SUCCESS;break;
                    default:t=SystemConfig.PAY_STATUS_FINASH;break;
                }

            }else if(pay.getType()==SystemConfig.PAY_WX){
                //微信
                String r=WxPayUtil.queryPay(oid);
                switch (r){
                    case "NOTPAY":t=SystemConfig.PAY_STATUS_NO;break;
                    case "CLOSED":t=SystemConfig.PAY_STATUS_CLOSE;break;
                    case "SUCCESS":t=SystemConfig.PAY_STATUS_SUCCESS;break;
                    default:t=SystemConfig.PAY_STATUS_FINASH;break;
                }
            }
            if(t>0 && t!=pay.getFlag()){
                //同步数据库的支付状态修改
                dao.updateFlag(pay.getOid(),t);
                logDao.save(new PayLog(pay.getId(),t,"支付状态发送改变"));
            }
            return R.ok(t);
        }
        return R.fail();
    }

    @Override
    public R closePay(String oid) {
        //关闭支付，支付未付款
        Pay pay=dao.select(oid);
        if(pay!=null){
            boolean r=false;
            if(pay.getFlag()==SystemConfig.PAY_STATUS_NO){
                //允许关闭支付
                if(pay.getType()==SystemConfig.PAY_ALI){
                    r=AliPayUtil.closePay(oid);
                }else if(pay.getType()==SystemConfig.PAY_WX){
                    r=WxPayUtil.closePay(oid);
                }
            }
            if(r){
                //更新支付状态
                dao.updateFlag(oid,SystemConfig.PAY_STATUS_CLOSE);
                logDao.save(new PayLog(pay.getId(),SystemConfig.PAY_STATUS_CLOSE,"关闭支付订单"));
                return R.ok();
            }
        }
        return R.fail();
    }

    @Override
    public R all() {
        return R.ok(dao.selectAll());
    }
}
